/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package TADs;

import javax.swing.JOptionPane;

/**
 *
 * @author Achiles
 */
//*****************Lista Duplamente Encadeada Circular **************//
public class ListaDEC {

    private No primeiro, auxiliar;
    //Total de nós
    int totalNos;

    //Construtor da lista
    public ListaDEC() {
        primeiro = auxiliar = null;
        totalNos = 0;
    }

    //Retorna o total de nós da Lista
    public int getTotalNos() {
        return totalNos;
    }

    // Verifica se está vazia
    public boolean Vazia() {
        if (getTotalNos() == 0) {
            return true;
        }
        return false;
    }

    public void inserir(int v) {
        No temp = new No(v);
        //Caso 1: A lista contém elementos
        if (primeiro != null) {
            temp.prox = primeiro;
            temp.ant = primeiro.ant;
            primeiro.ant = temp;
            primeiro = temp;
        } //Caso 2: A lista está vazia
        else {
            primeiro = temp;
            primeiro.prox = primeiro;
            primeiro.ant = primeiro;
        }
        totalNos++;
    }

    public void excluirNo(int v) {
        No temp = new No(v);
        auxiliar = primeiro;
        //Caso Geral: A lista contém elementos
        if (primeiro != null) {
            //Caso 2: Remover no começo da lista
            if (primeiro.valor == v) {
                //Caso 2.1: A lista possui somente um elemento
                if (primeiro.prox == primeiro) {
                    primeiro = null;
                } //Caso 2.2: A lista possui mais elementos
                else {
                    primeiro.prox.ant = primeiro.ant;
                    primeiro.ant.prox = primeiro.prox;
                    primeiro = primeiro.prox;
                }
                totalNos--;
            } else {
                //Percorre a lista até encontrar o lugar correto para retirar o elemento
                while (auxiliar.prox.valor != v || auxiliar.prox == primeiro) {
                    auxiliar = auxiliar.prox;
                }
                //Caso 3: Remover no meio da lista
                if (auxiliar.prox != primeiro) {
                    auxiliar.prox.ant = auxiliar.ant;
                    auxiliar.ant.prox = primeiro.prox;
                    totalNos--;
                } //Caso 4: Não está na lista
                else {
                    JOptionPane.showMessageDialog(null, "O elemento que você tentou remover não está na lista !", "Erro", JOptionPane.ERROR_MESSAGE);
                }
            }


        } //Caso 1: A lista está vazia
        else {
            JOptionPane.showMessageDialog(null, "A Lista está Vazia!", "Erro", JOptionPane.ERROR_MESSAGE);
        }

    }

    public void exibirLista() {

        auxiliar = primeiro;
        // Caso contenha elementos
        if (auxiliar != null) {
            JOptionPane.showMessageDialog(null,"Os elementos que estão na lista são: ");
            for(int i = 0; i<totalNos;i++){
                JOptionPane.showMessageDialog(null,auxiliar.valor);
                auxiliar=auxiliar.prox;
            }
        } //Lista vazia
        else {
            JOptionPane.showMessageDialog(null, "A Lista está Vazia!", "Erro", JOptionPane.ERROR_MESSAGE);
        }

    }
}
